/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
const uint8_t  Font[][5] = { // char hex ascii number 
{0x00,0x00,0x00,0x00,0x00}, // 0x20 32 0
{0x00,0x00,0x6f,0x00,0x00}, // ! 0x21 33 1
{0x00,0x07,0x00,0x07,0x00}, // " 0x22 34 2
{0x14,0x7f,0x14,0x7f,0x14}, // # 0x23 35 3
{0x00,0x07,0x04,0x1e,0x00}, // $ 0x24 36 4
{0x23,0x13,0x08,0x64,0x62}, // % 0x25 37 5
{0x36,0x49,0x56,0x20,0x50}, // & 0x26 38 6
{0x00,0x00,0x07,0x00,0x00}, // ' 0x27 39 7
{0x00,0x1c,0x22,0x41,0x00}, // ( 0x28 40 8
{0x00,0x41,0x22,0x1c,0x00}, // ) 0x29 41 9
{0x14,0x08,0x3e,0x08,0x14}, // * 0x2a 42 10
{0x08,0x08,0x3e,0x08,0x08}, // + 0x2b 43 11
{0x00,0x50,0x30,0x00,0x00}, // , 0x2c 44 12
{0x08,0x08,0x08,0x08,0x08}, // - 0x2d 45 13
{0x00,0x60,0x60,0x00,0x00}, // . 0x2e 46 14
{0x20,0x10,0x08,0x04,0x02}, // / 0x2f 47 15
{0x3e,0x51,0x49,0x45,0x3e}, // 0 0x30 48 16
{0x00,0x42,0x7f,0x40,0x00}, // 1 0x31 49 17
{0x42,0x61,0x51,0x49,0x46}, // 2 0x32 50 18
{0x21,0x41,0x45,0x4b,0x31}, // 3 0x33 51 19
{0x18,0x14,0x12,0x7f,0x10}, // 4 0x34 52 20
{0x27,0x45,0x45,0x45,0x39}, // 5 0x35 53 21
{0x3c,0x4a,0x49,0x49,0x30}, // 6 0x36 54 22
{0x01,0x71,0x09,0x05,0x03}, // 7 0x37 55 23 
{0x36,0x49,0x49,0x49,0x36}, // 8 0x38 56 24
{0x06,0x49,0x49,0x29,0x1e}, // 9 0x39 57 25
{0x00,0x36,0x36,0x00,0x00}, // : 0x3a 58 26
{0x00,0x56,0x36,0x00,0x00}, // ; 0x3b 59 27
{0x08,0x14,0x22,0x41,0x00}, // < 0x3c 60 28
{0x14,0x14,0x14,0x14,0x14}, // = 0x3d 61 29
{0x00,0x41,0x22,0x14,0x08}, // > 0x3e 62 30
{0x02,0x01,0x51,0x09,0x06}, // ? 0x3f 63 31
{0x3e,0x41,0x5d,0x49,0x4e}, // @ 0x40 64 32
{0x7e,0x09,0x09,0x09,0x7e}, // A 0x41 65 33
{0x7f,0x49,0x49,0x49,0x36}, // B 0x42 66 34
{0x3e,0x41,0x41,0x41,0x22}, // C 0x43 67 35
{0x7f,0x41,0x41,0x41,0x3e}, // D 0x44 68 36
{0x7f,0x49,0x49,0x49,0x41}, // E 0x45 69 37
{0x7f,0x09,0x09,0x09,0x01}, // F 0x46 70 38
{0x3e,0x41,0x49,0x49,0x7a}, // G 0x47 71 39
{0x7f,0x08,0x08,0x08,0x7f}, // H 0x48 72 40
{0x00,0x41,0x7f,0x41,0x00}, // I 0x49 73 41
{0x20,0x40,0x41,0x3f,0x01}, // J 0x4a 74 42
{0x7f,0x08,0x14,0x22,0x41}, // K 0x4b 75 43 
{0x7f,0x40,0x40,0x40,0x40}, // L 0x4c 76 44
{0x7f,0x02,0x0c,0x02,0x7f}, // M 0x4d 77 45
{0x7f,0x04,0x08,0x10,0x7f}, // N 0x4e 78 46
{0x3e,0x41,0x41,0x41,0x3e}, // O 0x4f 79 47
{0x7f,0x09,0x09,0x09,0x06}, // P 0x50 80 48
{0x3e,0x41,0x51,0x21,0x5e}, // Q 0x51 81 49
{0x7f,0x09,0x19,0x29,0x46}, // R 0x52 82 50
{0x46,0x49,0x49,0x49,0x31}, // S 0x53 83 51
{0x01,0x01,0x7f,0x01,0x01}, // T 0x54 84 52
{0x3f,0x40,0x40,0x40,0x3f}, // U 0x55 85 53
{0x0f,0x30,0x40,0x30,0x0f}, // V 0x56 86 54
{0x3f,0x40,0x30,0x40,0x3f}, // W 0x57 87 55
{0x63,0x14,0x08,0x14,0x63}, // X 0x58 88 56
{0x07,0x08,0x70,0x08,0x07}, // Y 0x59 89 57
{0x61,0x51,0x49,0x45,0x43}, // Z 0x5a 90 58
{0x3c,0x4a,0x49,0x29,0x1e}, // [ 0x5b 91 59
{0x02,0x04,0x08,0x10,0x20}, // \ 0x5c 92 60
{0x00,0x41,0x7f,0x00,0x00}, // ] 0x5d 93 61
{0x04,0x02,0x01,0x02,0x04}, // ^ 0x5e 94 62
{0x40,0x40,0x40,0x40,0x40}, // _ 0x5f 95 63
{0x00,0x00,0x03,0x04,0x00}, // ` 0x60 96 64
{0x20,0x54,0x54,0x54,0x78}, // a 0x61 97 65
{0x7f,0x48,0x44,0x44,0x38}, // b 0x62 98 66
{0x38,0x44,0x44,0x44,0x20}, // c 0x63 99 67
{0x38,0x44,0x44,0x48,0x7f}, // d 0x64 100 68
{0x38,0x54,0x54,0x54,0x18}, // e 0x65 101 69
{0x08,0x7e,0x09,0x01,0x02}, // f 0x66 102 70
{0x0c,0x52,0x52,0x52,0x3e}, // g 0x67 103 71
{0x7f,0x08,0x04,0x04,0x78}, // h 0x68 104 72
{0x00,0x44,0x7d,0x40,0x00}, // i 0x69 105 73
{0x20,0x40,0x44,0x3d,0x00}, // j 0x6a 106 74
{0x00,0x7f,0x10,0x28,0x44}, // k 0x6b 107 75
{0x00,0x41,0x7f,0x40,0x00}, // l 0x6c 108 76
{0x7c,0x04,0x18,0x04,0x78}, // m 0x6d 109 77
{0x7c,0x08,0x04,0x04,0x78}, // n 0x6e 110 78
{0x38,0x44,0x44,0x44,0x38}, // o 0x6f 111 79
{0x7c,0x14,0x14,0x14,0x08}, // p 0x70 112 80
{0x08,0x14,0x14,0x18,0x7c}, // q 0x71 113 81
{0x7c,0x08,0x04,0x04,0x08}, // r 0x72 114 82
{0x48,0x54,0x54,0x54,0x20}, // s 0x73 115 83
{0x04,0x3f,0x44,0x40,0x20}, // t 0x74 116 84
{0x3c,0x40,0x40,0x20,0x7c}, // u 0x75 117 85
{0x1c,0x20,0x40,0x20,0x1c}, // v 0x76 118 86
{0x3c,0x40,0x30,0x40,0x3c}, // w 0x77 119 87
{0x44,0x28,0x10,0x28,0x44}, // x 0x78 120 88
{0x0c,0x50,0x50,0x50,0x3c}, // y 0x79 121 89
{0x44,0x64,0x54,0x4c,0x44}, // z 0x7a 122 90
{0x00,0x08,0x36,0x41,0x41}, // { 0x7b 123 91
{0x00,0x00,0x7f,0x00,0x00}, // | 0x7c 124 92
{0x41,0x41,0x36,0x08,0x00}, // } 0x7d 125 93
{0x04,0x02,0x04,0x08,0x04}, // ~ 0x7e 126 94
};

//void led_off(uint8_t num)
//{
//  switch(num){
//    case 0: 
//       HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, 0); 
//    break;
//    case 1: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, 0);  
//    break;
//    case 2: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, 0);  
//    break;
//    case 3: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, 0); 
//    break; 
//    case 4: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0);  
//    break;
//    case 5: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0);  
//    break;
//    case 6: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, 0); 
//    break;
//    case 7: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, 0);  
//    break;
//    default: break;
//  }
//}

//void led_on(uint8_t num)
//{
//  switch(num){
//    case 0: 
//       HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, 1); 
//    break;
//    case 1: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, 1);  
//    break;
//    case 2: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, 1);  
//    break;
//    case 3: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, 1); 
//    break; 
//    case 4: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1);  
//    break;
//    case 5: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1);  
//    break;
//    case 6: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, 1); 
//    break;
//    case 7: 
//      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, 1);  
//    break;
//    default: break;
//  }
//}

void POVdisplay (char POVstring[])
{
  uint8_t charSpace = 1; // space between letters
  uint8_t strSpace = 12; // space between repeated string.
  uint8_t length = strlen(POVstring);
  uint8_t data = 0;
  uint8_t led_value[8]; 
  for (uint8_t text_num = 0; text_num < length; text_num++)
  {
    for (uint8_t col = 0; col < 5; col++)
    {
      data = Font[POVstring[text_num] - 32][col] ;
      for(uint8_t led_num = 0; led_num < 8; led_num++)
      {
        
        if(data & 0x80)
        {
          led_value[led_num] = 0;
          //led_on(led_num);
        }
        else {
          led_value[led_num] = 1;
          //led_off(led_num);
        }
        data =data << 1; 
      }
      HAL_GPIO_WritePin(GPIOA, LED(0), led_value[0]);
      HAL_GPIO_WritePin(GPIOA, LED(1), led_value[1]);
      HAL_GPIO_WritePin(GPIOA, LED(2), led_value[2]);
      HAL_GPIO_WritePin(GPIOA, LED(3), led_value[3]);
      HAL_GPIO_WritePin(GPIOA, LED(4), led_value[4]);
      HAL_GPIO_WritePin(GPIOA, LED(5), led_value[5]);
      HAL_GPIO_WritePin(GPIOA, LED(6), led_value[6]);
      HAL_GPIO_WritePin(GPIOA, LED(7), led_value[7]);
      for(uint32_t i=0;i < 5900;i++);//6000 字母粗细

    }
     HAL_GPIO_WritePin(GPIOA, LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin 
                          |LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin, GPIO_PIN_SET);//消除单词最后一个字母产生阴影
    HAL_Delay(charSpace);
  }

  HAL_Delay(strSpace);
}

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  { 
    POVdisplay("I Love You");
    /* USER CODE END WHILE */
   
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
